"""
@author: xxw
@file: 05.python的内存管理.py
@time: 2023/4/21 16:15
"""
# python 一切皆对象
# 当有新的对象引用的时候，引用计数+1
# 当有对象删除引用的时候，引用计数-1

# a = 10  #保存数值10， 类对象指针， 引用技术， 类型




# 引用计数
# getrefcount(a)
# 2
# b = 300
# getrefcount(b)
# 2

# 引用计数解决不了循环引用的问题

# 得使用gc （分代回收）    stop the world STW
# 存活时间越久的对象，越不可能在后面的程序中变成垃圾
# 阈值

# 标记-清除
# 主要解决循环引用
# 1、标记：活动(有被引用)，非活动(可被删除)
# 2、清除：清除所有非活动的对象

# 以引用计数为主，分代回收和标记清除为辅的垃圾回收方式（此句与下句乃精华也）
# 内存分配的时候，引入内存池机制，缓存小整数和简单字符串



# 小整数缓冲池[-5~256]
# 程序运行的时候会创建-5到256的小整数放到内存池中
# 创建整数对象的时候，在-5到256之间，就直接从内存池分配
# 不在这个区间，就创建新对象

# 简单字符串驻留区

#############深浅拷贝
# from copy import deepcopy 只有这种拷贝是深拷贝

#深浅拷贝只有在容器中包含可变数据类型的时候才会有区别
#浅拷贝只会拷贝最外层（第一层） 数据的引用，它里面可变数据类型的修改，可能会影响原来的那个对象
#深拷贝会对容器类型里面的可变数据类型做一次全新的copy，生成新的可变数据类型，它里面的修改不会影响原来那个对象
lst1 = [[]] * 3
print(lst1)
lst1[0].append(1)
print(lst1)
